﻿// See https://aka.ms/new-console-template for more information
using System;
using System.Collections.Generic;
using static System.Runtime.InteropServices.JavaScript.JSType;

////定义委托：在代码中，我们首先定义了一个委托 ButtonClickedEventHandler，它将被用于事件处理。
////    委托是类型安全的函数指针，它用于引用一个方法。

////定义事件：在 Button 类中，我们声明了一个事件 ButtonClicked，
////    这个事件使用了我们定义的委托。事件是基于委托的特殊类型成员，用于对象之间的通知机制。

////触发事件：在 Button 类中，有一个方法 OnButtonClicked，它用于触发事件。
////    我们在 Click 方法中调用了 OnButtonClicked，以模拟按钮被按下时的情况。

////订阅事件：在 Program 类的 Main 方法中，我们创建了 Button 和 Subscriber
////    的实例，并使用 += 操作符将 subscriber.OnButtonClicked 方法订阅到 button.ButtonClicked 事件上
////    。当按钮被点击时，事件将被触发，订阅者的方法将被调用。

////执行代码：当我们运行程序时，调用 button.Click() 将触发 ButtonClicked 
////    事件，订阅者的方法将执行，输出相应的信息。

//namespace EventAndDelegateDemo
//{
//    // Step 1: 定义一个委托
//    public delegate void ButtonClickedEventHandler(object sender, EventArgs e);

//    // Step 2: 定义一个类来包含事件
//    public class Button
//    {
//        // Step 3: 声明一个事件，使用上面定义的委托
//        public event ButtonClickedEventHandler ButtonClicked;

//        // 模拟按钮被按下的方法
//        public void Click()
//        {
//            Console.WriteLine("Button is clicked!");
//            OnButtonClicked(EventArgs.Empty);
//        }

//        // 触发事件的方法
//        protected virtual void OnButtonClicked(EventArgs e)
//        {
//            // 检查是否有订阅者
//            ButtonClicked?.Invoke(this, e);
//        }
//    }

//    // 订阅者类
//    public class Subscriber
//    {
//        public void OnButtonClicked(object sender, EventArgs e)
//        {
//            Console.WriteLine("Subscriber received the Button Clicked event.");
//        }
//    }

//    class Program
//    {
//        static void Main(string[] args)
//        {
//            // 创建按钮实例
//            Button button = new Button();

//            // 创建订阅者实例
//            Subscriber subscriber = new Subscriber();

//            // 订阅事件
//            button.ButtonClicked += subscriber.OnButtonClicked;

//            // 模拟按钮被按下
//            button.Click();

//            Console.ReadLine();
//        }
//    }
//}


//字段:实例字段,静态字段

//属性

//namespace bit
//{
//    class Program
//    {
//        static void Main(string[] args)
//        {
//            try
//            {
//                Student student = new Student();
//                student.Age = 100;
//                Console.WriteLine(student.Canwork);
//            }
//            catch (Exception ex)
//            {
//                Console.WriteLine(ex.Message);
//                throw;
//            }

//        }
//    }
//    //动态计算
//    class Student
//    {
//        private int age;

//        public int Age
//        {
//            get { return age; }
//            set 
//            { 
//                age = value;
//                //每创建一个对象都更新canwork
//                this.CalculateCanwork();
//            }
//        }

//        private bool canwork;

//        public bool Canwork
//        {
//            get { return canwork; }
//        }

//        private void CalculateCanwork()
//        { 
//            if(age>18) canwork = true;
//            else canwork = false;
//        }



//        //实时计算
//        //private bool canwork;

//        //public bool Canwork
//        //{
//        //    get 
//        //    {
//        //        if(this.age>18)
//        //        {
//        //            return true;
//        //        }
//        //        else
//        //        {
//        //            return false;   
//        //        }
//        //    }
//        //}

//    }
//    //class Student
//    //{
//    //    private static int amount;

//    //    public static int Amount
//    //    {
//    //        get { return amount; }
//    //        set {
//    //            if(value >= 0)
//    //            {
//    //                amount = value;
//    //            }
//    //            else
//    //            {
//    //                throw new Exception("error");
//    //            }
//    //        }
//    //    }
//    //}
//}

//索引器的实现
//namespace shh
//{
//    class Program()
//    {
//        static void Main(string[] args)
//        {
//            try
//            {
//                Student student = new Student();
//                student["math"] = 99;
//                Console.WriteLine(student["math"]);
//            }
//            catch (Exception ex) //接收异常
//            {
//                Console.WriteLine(ex.Message);
//                throw;
//            }
//        }
//    }

//    class Student
//    {
//        private Dictionary<string,int> dic = new Dictionary<string,int>();
        
//        //可空类型,
//        public int? this[string key]
//        {
//            get { return dic[key]; }
//            set
//            {
//                //数据如果为空,抛异常
//                if(value.HasValue==false)
//                {
//                    throw new Exception("value is error");
//                }

//                if(dic.ContainsKey(key))
//                {
//                    dic[key] = value.Value;
//                }
//                else
//                {
//                    dic.Add(key, value.Value);
//                }
//            }
//        }
//    }
//}